import 修正的密钥算法 as KEY
from F_func import func
import 明文预处理和IP置换 as M


def encrypt_DES(IP,key):
    for i in range(16):#16次循环中第i次循环
        key_last = func(IP[32:],key[i])#后32位和轮密钥输入到f函数中
        IP_next = list(range(64))#初始化列表
        for a in range(32):                             
            IP_next[a] = IP[a+32]#第i+1次的前32位       #前32位由之前的后32位复制
        for a in range(32):                             
            IP_next[a+32] = str(int(IP[a])^int(key_last[a]))#第i+1次的后32位     #后32位由之前的前32位处理后得到，，，面向结果的思维。
        IP_next = ''.join(IP_next)#列表转换为字符串
        if i==15:#第16轮撤回交叉
            IP_next = IP_next[32:] + IP_next[:32]
        IP = IP_next#赋值给IP
    #逆置换
    result = M.ip_inv_change(IP)
    return result

def decrypt_DES(IP,key):#输入64位二进制串，输出64位前后合并二进制串
    for i in range(16):#16次循环中第i次循环
        key_last = func(IP[32:],key[15-i])#后32位和轮密钥输入到f函数中,但是密钥需要从最后一个开始，即15-i个
        IP_next = list(range(64))#初始化列表
        for a in range(32):
            IP_next[a] = IP[a+32]#第i+1次的前32位
        for a in range(32):
            IP_next[a+32] = str(int(IP[a])^int(key_last[a]))#第i+1次的后32位
        IP_next = ''.join(IP_next)#列表转换为字符串  
        if i==15:#第16轮撤回交叉
            IP_next = IP_next[32:] + IP_next[:32]              
        IP = IP_next#赋值给IP
    #逆置换    
    result = M.ip_inv_change(IP)
    return result


if __name__  == '__main__':

    #引用密钥生成函数
    generated_keys = KEY.generate_DES_key()
    if not generated_keys:
        print("密钥生成失败。")


    #使用明文IP,进行加密
    # IP = M.process()
    IP = '1100110000000000110011001111111111110000101010101111000010101010'
    cypher = encrypt_DES(IP,generated_keys)
    print('加密后的2进制密文：',cypher)
    #2进制转16进制
    encryp_result = ''
    for i in range(0,64,4):
        sample_int = int(cypher[i:i+4],2)
        sample = '{:x}'.format(sample_int)
        encryp_result += sample
    # decryp_result = "{:x}".format(int(decryp_message,2))
    print('加密后的16进制密文：',encryp_result)



    #解密

    #对密文先进行P置换成IP
    cypher_IP = M.ip_change(cypher)
    #解密函数
    decryp_message = decrypt_DES(cypher_IP,generated_keys)
    # print('decryp_message:',decryp_message)
    #2进制转16进制
    decryp_result = ''
    for i in range(0,64,4):
        sample_int = int(decryp_message[i:i+4],2)
        sample = '{:x}'.format(sample_int)
        decryp_result += sample
    # decryp_result = "{:x}".format(int(decryp_message,2))
    print('解密后的16进制明文：',decryp_result)



#数据使用举例
#IP = '11110000101010101111000010101010'
#64位初始 key = '0001101100000010111011111111110001110000011100101010110001101101'
# 16位十六进制初始 key='0123456789ABCDEF'

'''
直接调用函数即可,返回值为最后一次的输出值
示例: IP_16 = encrypt(IP)
'''


#经验总结
# 2进制转16进制
# 内置循环有语法限制，无法实现b->hex,只能用外循环
# 若不分割，整个数据串直接Int，首位的0会被int去掉
# "{:x}".format(int(decryp_message,2))，就是丢失首位的0
#